/******************************************************************************
* 文件名称: queue.h
* 内容摘要: 队列头文件
* 创建者の: 孔佳伟
* 个人主页: https://gitee.com/thin-wind/jump
* 修改记录: 
******************************************************************************/

#ifndef __QUEUE_H_
#define __QUEUE_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <common.h>
#include <list.h>

typedef struct QUEUE
{
    LIST_NODE list;
    U32 length;
} QUEUE;

typedef LIST_NODE     QUEUE_NODE;

// 获取队列节点首地址
#define QUEUE_NODE(ptr, type, member)    container_of(ptr, type, member)


/******************************************************************************
* 函数名称: void QueueInit(QUEUE* queue)
* 功能说明: 队列初始化
* 输入参数: QUEUE* queue      --队列
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void QueueInit(QUEUE* queue);

/******************************************************************************
* 函数名称: void QueueAdd(QUEUE* queue, QUEUE_NODE* node)
* 功能说明: 在队列尾插入一个节点
* 输入参数: QUEUE* queue      --队列
    　　　　QUEUE_NODE* node  --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void QueueAdd(QUEUE* queue, QUEUE_NODE* node);

/******************************************************************************
* 函数名称: void QueueHeadAdd(QUEUE* queue, QUEUE_NODE* node)
* 功能说明: 在队列头插入一个节点
* 输入参数: QUEUE* queue      --队列
    　　　　QUEUE_NODE* node  --节点
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
void QueueHeadAdd(QUEUE* queue, QUEUE_NODE* node);

/******************************************************************************
* 函数名称: QUEUE_NODE* QueueRemove(QUEUE* queue)
* 功能说明: 从队列头取出一个节点
* 输入参数: QUEUE* queue      --队列
* 输出参数: 无
* 函数返回: 取出的节点
* 其它说明: 无
******************************************************************************/
QUEUE_NODE* QueueRemove(QUEUE* queue);

/******************************************************************************
* 函数名称: QUEUE_NODE* QueueTailRemove(QUEUE* queue)
* 功能说明: 从队列尾取出一个节点
* 输入参数: QUEUE* queue      --队列
* 输出参数: 无
* 函数返回: 取出的节点
* 其它说明: 无
******************************************************************************/
QUEUE_NODE* QueueTailRemove(QUEUE* queue);

/******************************************************************************
* 函数名称: BOOL QueueIsEmpty(QUEUE* queue)
* 功能说明: 队列是否为空
* 输入参数: QUEUE* queue      --队列
* 输出参数: 无
* 函数返回: 0:否; 1:是
* 其它说明: 无
******************************************************************************/
BOOL QueueIsEmpty(QUEUE* queue);

/******************************************************************************
* 函数名称: U32 QueueLength(QUEUE* queue)
* 功能说明: 获取队列长度
* 输入参数: QUEUE* queue      --队列
* 输出参数: 无
* 函数返回: 队列长度
* 其它说明: 无
******************************************************************************/
U32 QueueLength(QUEUE* queue);


#ifdef __cplusplus
}
#endif

#endif

